/**
 * 
 */
package br.com.dp.servidor.criptografia;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.apache.commons.codec.binary.Hex;

/**
 * @author emmanuel
 * Classe responsável por prover criptografia de acordo com um determinado algoritmo.
 */
public abstract class CriptografiaGenerica {

	private MessageDigest messageDigest;

	/**
	 * 
	 * @param algoritmo Algoritmo de criptografia.
	 * @throws NoSuchAlgorithmException
	 */
	public void usarAlgoritmo(String algoritmo) throws NoSuchAlgorithmException {
		if (messageDigest == null || messageDigest.getAlgorithm() != algoritmo) {
			messageDigest = MessageDigest.getInstance(algoritmo);
		}
	}

	/**
	 * 
	 * @param algoritmo Algoritmo de criptografia.
	 * @param valor String a ser criptografada.
	 * @return {@link String} Hash do valor.
	 * @throws NoSuchAlgorithmException
	 * @throws UnsupportedEncodingException 
	 */
	public String encryptByAlgoritmo(String algoritmo, String valor) throws NoSuchAlgorithmException {
		if (valor == null) {
			throw new IllegalArgumentException();
		}
		usarAlgoritmo(algoritmo);
		byte[] hash = null;
		hash = messageDigest.digest(valor.getBytes());
		return Hex.encodeHexString(hash);
	}
}
